package com.mingke.java.GroupChat;

import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;

/**
 * @author mingke
 * @function NIO处理数据的模版类，负责定义必要的数据结构和规定算法执行顺序
 * @date 2021/11/9
 */
public abstract class NIOHandlerTemplate {
    //定义服务端口
    Integer serverPort = 2021;
    //全局统一的ID
    byte uid = 10;
    //服务端通道
    ServerSocketChannel serverSocketChannel = null;
    //需要用到的selector
    Selector selector = null;

    public void handler() {
        initServerSocket();
        while(true) {
            if(listen()) {
                checkKey();
            }else {
                continue;
            }
        }
    }

    /**
     * @desc 初始化Socket服务器
     */
    public abstract void initServerSocket();

    /**
     * 监听Socket端口
     * @return 是否有情况
     */
    public abstract boolean listen();

    /**
     * @desc 检查相关的SelectKey并且进行不同类型请求的分发
     */
    public abstract void checkKey();

    /**
     * @desc 响应客户端的接入请求
     * @param key 要处理的SelectKey
     */
    public abstract void doConnect(SelectionKey key);

    /**
     * @desc 响应客户端发过来的消息
     * @param key 要处理的SelectKey
     */
    public abstract void doRead(SelectionKey key);

    /**
     * @desc 发送消息到指定的客户端
     * @param bytes 要发送的消息
     * @param channel 指定的客户端的通道
     */
    public abstract void send(byte bytes[], SocketChannel channel);
}
